﻿using System.Configuration;
using System.Web;
using System.Web.Configuration;
using System.Reflection;
using System;
using System.Web.Security;
using System.Text;

namespace Ecopsy.DataTier
{
    public static class AppContext 
    {
        private const string PwdCookieKey = "Pwd";
        /// <summary>
        /// Контекст используемый уровнем данных DataTier
        /// 1. Пул SecuretyContext для работы с БД
        /// 2. Константы используемые DataTier.
        /// </summary>
       

        /// <summary>
        /// Дать контекст безопасности
        /// </summary>
        /// <param name="Name"></param>
        /// <returns></returns>
        public static SecuretyContext GetSC(string Name)
        {
            string UserName;
            try
            {
                UserName = HttpContext.Current.User.Identity.Name;
            }
            catch
            {
                UserName = string.Empty;
            }

            if(string.IsNullOrEmpty (UserName)) 
                return new SecuretyContext ();            

            if( null== HttpContext.Current.Request.Cookies[PwdCookieKey])
                 return null;

            string s=HttpContext.Current.Request.Cookies[PwdCookieKey].Value;
            byte[]  bytes =CookieProtectionHelperWrapper.Decode(CookieProtection.Encryption, s);
            System.Text.UTF8Encoding enc = new System.Text.UTF8Encoding();
            s = enc.GetString(bytes);

            return new SecuretyContext(UserName,s ); 
            
        }
        public static SecuretyContext GetSC()
        {
            string UserName;            
            UserName = HttpContext.Current.User.Identity.Name;
            

            if (string.IsNullOrEmpty(UserName))
                return new SecuretyContext();

            if (null == HttpContext.Current.Request.Cookies[PwdCookieKey])
                return null;

            string s = HttpContext.Current.Request.Cookies[PwdCookieKey].Value;
            byte[] bytes = CookieProtectionHelperWrapper.Decode(CookieProtection.Encryption, s);
            System.Text.UTF8Encoding enc = new System.Text.UTF8Encoding();
            s = enc.GetString(bytes);

            return new SecuretyContext(UserName, s);

        }
        
        public static string UserName
        {
            get { return HttpContext.Current.User.Identity.Name; }

        }

        /// <summary>
        /// Праоль зашфрованный на ключе сеанаса
        /// </summary>
        public static string Pwd
        {
            get
            {
                if (null == HttpContext.Current.Request.Cookies[PwdCookieKey])
                    return string.Empty ;
                return HttpContext.Current.Request.Cookies[PwdCookieKey].Value;
            }
        }

        /// <summary>
        /// Праоль зашфрованный на ключе сеанаса
        /// </summary>
        public static string DecodePwd(string Pwd)
        {
            try
            {
                byte[] bytes = CookieProtectionHelperWrapper.Decode(CookieProtection.Encryption, Pwd);
                System.Text.UTF8Encoding enc = new System.Text.UTF8Encoding();
                return enc.GetString(bytes);
            }
            catch
            {
                return Pwd;
            }

        }



                
        public static void SetSC(string Name, string Pwd)
        {            
            byte[] bytes = new UTF8Encoding().GetBytes(Pwd);

            Pwd = CookieProtectionHelperWrapper.Encode(CookieProtection.Encryption, bytes, bytes.Length);


            HttpCookie _Pwd = new HttpCookie(PwdCookieKey, Pwd);         
            if (null == HttpContext.Current.Response.Cookies[PwdCookieKey])
                HttpContext.Current.Response.AppendCookie(_Pwd);
            else
                HttpContext.Current.Response.SetCookie(_Pwd);
        }

        public static string  GetSetting(string id)
        {
            return ConfigurationSettings.AppSettings[id];
        }

        public static string GetSetting(string SectionId, string ParamId)
        {
            return string.Empty;  
        }

        /// <summary>
        /// Директория приложения. 
        /// </summary>
        public static string AppDirectory = string.Empty;

        /// <summary>
        ///  Элементы пула SC по умолчанию MasterSCPref - контекст безопасности БД пользователей
        /// </summary>
        public const string MasterSCPref = "MasterSC";

        /// <summary>
        ///  Элементы пула SC по умолчанию AppSC - контекст безопасности рабочей БД 
        /// </summary>
        public const string AppSCPref = "AppSC";

        /// <summary>
        /// Расположение каталога с файлами XSLT
        /// Полный путь вычисляется как AppDirectory+XSLT_BaseCatalog
        /// </summary>
        public const string XSLT_BaseCatalog = "XSLT";

        /// <summary>
        /// Поле объекта в котором расположен  каталог с файлом проверки XSLT - бизнес проверки этого объекта
        /// </summary>
        public const string ReservedField_XSLT_Catalog = "XSLT_Catalog";
 
        /// <summary>
        /// Поле объекта в котором расположено название файла проверки по умолчанию название типа бизнес объекта
        /// </summary>
        public const string ReservedField_XSLT_File = "XSLT_File";

    }

    public static class CookieProtectionHelperWrapper
    {

        private static MethodInfo _encode;
        private static MethodInfo _decode;

        static CookieProtectionHelperWrapper()
        {
            // obtaining a reference to System.Web assembly

            Assembly systemWeb = typeof(HttpContext).Assembly;
            if (systemWeb == null)
            {
                throw new InvalidOperationException(
                    "Unable to load System.Web.");
            }
            // obtaining a reference to the internal class CookieProtectionHelper

            Type cookieProtectionHelper = systemWeb.GetType(
                    "System.Web.Security.CookieProtectionHelper");
            if (cookieProtectionHelper == null)
            {
                throw new InvalidOperationException(
                    "Unable to get the internal class CookieProtectionHelper.");
            }
            // obtaining references to the methods of CookieProtectionHelper class

            _encode = cookieProtectionHelper.GetMethod(
                    "Encode", BindingFlags.NonPublic | BindingFlags.Static);
            _decode = cookieProtectionHelper.GetMethod(
                    "Decode", BindingFlags.NonPublic | BindingFlags.Static);

            if (_encode == null || _decode == null)
            {
                throw new InvalidOperationException(
                    "Unable to get the methods to invoke.");
            }
        }

        public static string Encode(CookieProtection cookieProtection,
                                    byte[] buf, int count)
        {
            return (string)_encode.Invoke(null,
                    new object[] { cookieProtection, buf, count });
        }

        public static byte[] Decode(CookieProtection cookieProtection,
                                    string data)
        {
            return (byte[])_decode.Invoke(null,
                    new object[] { cookieProtection, data });
        }

    }
}



